<?php
// +----------------------------------------------------------------------
// | 微信支付类
// +----------------------------------------------------------------------
// | Copyright (c) 2014 http://www.jucehng01.net All rights reserved.
// +----------------------------------------------------------------------
// | Author: 明 Jucheng<jiangxingming@outlook.com> 
// +----------------------------------------------------------------------
namespace Wechat\Controller;

class WxpayController extends WechatController {
	
	
	
	
	/**
	* 本地签名
	* @date: 2015-1-28
	* @author: 明
	* @return:
	*/
	public function checkSign($data)
	{
		$tmpData = $data;
		unset($tmpData['sign']);
		$sign = $this->getSign($tmpData);//本地签名
		if ($data['sign'] == $sign) {
			return TRUE;
		}
		return FALSE;
	}
	/**
	 * 设置返回微信的xml数据
	 */
	public function setReturnParameter($parameter, $parameterValue,$returnParameters)
	{
		$returnParameters[$this->trimString($parameter)] = $this->trimString($parameterValue);
	}
	public function trimString($value)
	{
		$ret = null;
		if (null != $value)
		{
			$ret = $value;
			if (strlen($ret) == 0)
			{
				$ret = null;
			}
		}
		return $ret;
	}
	/**
	 * 	作用：设置jsapi的参数
	 */
	public function getParameters($prepay_id)
	{
		$jsApiObj =array();
		$dealarr = session('dealarr');
		$jsApiObj['appId'] = $dealarr['appid'];
		$timeStamp = time();
		$jsApiObj['timeStamp'] = (string)$timeStamp;
		$jsApiObj['nonceStr'] = $this->createNoncestr();
		$jsApiObj['package'] = 'prepay_id='.$prepay_id;
		$jsApiObj['signType'] = 'MD5';
		$jsApiObj['paySign'] = $this->getSign($jsApiObj);
		$parameters = json_encode($jsApiObj);
	
		return $parameters;
	}
	/**
	 * 获取PrepayId
	 * @date: 2014-10-22
	 * @author: 明
	 * @return:
	 */
	public function getPrepayId($openid,$dealarr){

		$url = "https://api.mch.weixin.qq.com/pay/unifiedorder";
		//设置curl超时时间
		$curl_timeout = 30;
		$xml = $this->createXml($openid,$dealarr);
		$response = $this->postXmlCurl($xml,$url,$curl_timeout);
		$result = $this->xmlToArray($response);
		$prepay_id = $result["prepay_id"];
	
		return $prepay_id;
		
	}
	
	public function createXml($openid){
	   // dump(session('dealarr'));
		//dump($openid);
		
		$parameters['body'] =array();
		//自定义订单号，此处仅作举例
		$parameters['openid'] = $openid;
		$dealarr = session('dealarr');
		$parameters['body'] = $dealarr['body'];
		$parameters['total_fee'] = $dealarr['total_fee'];
		$parameters['out_trade_no'] = $dealarr['out_trade_no'];
		$parameters['notify_url'] = $dealarr['notify_url'];
		$parameters['trade_type'] = 'JSAPI';
		$parameters['appid'] = $dealarr['appid'];//公众账号ID
		$parameters['mch_id'] = intval($dealarr['mch_id']);//商户号
		$parameters['nonce_str'] = $this->createNoncestr();//随机字符串
		$parameters['sign'] = $this->getSign($parameters);//签名
		return  $this->arrayToXml($parameters);
	}
	
	/**
	 * 	作用：post请求xml
	 */
	public function postXml()
	{
		$xml = $this->createXml();
		echo $xml;
		$response = $this->postXmlCurl($xml,$this->url,$this->curl_timeout);
		return $response;
	}
	public function xmlToArray($xml)
	{
		//将XML转为array
		$array_data = json_decode(json_encode(simplexml_load_string($xml, 'SimpleXMLElement', LIBXML_NOCDATA)), true);
		return $array_data;
	}
	/**
	 * 	作用：以post方式提交xml到对应的接口url
	 */
	public function postXmlCurl($xml,$url,$second=30)
	{
		//初始化curl
		$ch = curl_init();
		//设置超时
		curl_setopt($ch, CURLOP_TIMEOUT, $second);
		//这里设置代理，如果有的话
		//curl_setopt($ch,CURLOPT_PROXY, '8.8.8.8');
		//curl_setopt($ch,CURLOPT_PROXYPORT, 8080);
		curl_setopt($ch,CURLOPT_URL, $url);
		curl_setopt($ch,CURLOPT_SSL_VERIFYPEER,FALSE);
		curl_setopt($ch,CURLOPT_SSL_VERIFYHOST,FALSE);
		//设置header
		curl_setopt($ch, CURLOPT_HEADER, FALSE);
		//要求结果为字符串且输出到屏幕上
		curl_setopt($ch, CURLOPT_RETURNTRANSFER, TRUE);
		//post提交方式
		curl_setopt($ch, CURLOPT_POST, TRUE);
		curl_setopt($ch, CURLOPT_POSTFIELDS, $xml);
		//运行curl
		$data = curl_exec($ch);
		curl_close($ch);
		//返回结果
		if($data)
		{
			curl_close($ch);
			return $data;
		}
		else
		{
			$error = curl_errno($ch);
			echo "curl出错，错误码:$error"."<br>";
			echo "<a href='http://curl.haxx.se/libcurl/c/libcurl-errors.html'>错误原因查询</a></br>";
			curl_close($ch);
			return false;
		}
	}
	/**
	* 	作用：生成签名
	 */
	 public function getSign($Obj)
	 {
	 foreach ($Obj as $k => $v)
	 {
	 $Parameters[$k] = $v;
	 }
	 //签名步骤一：按字典序排序参数
	 ksort($Parameters);
	 $String = $this->formatBizQueryParaMap($Parameters, false);
	 //echo '【string1】'.$String.'</br>';
	 //签名步骤二：在string后加入KEY
	 $dealarr = session('dealarr');
	 $String = $String."&key=".$dealarr['partnerkey'];
	 		//echo "【string2】".$String."</br>";
	 //签名步骤三：MD5加密
	 $String = md5($String);
	 //echo "【string3】 ".$String."</br>";
	 //签名步骤四：所有字符转为大写
	 $result_ = strtoupper($String);
	 //echo "【result】 ".$result_."</br>";
	 return $result_;
	 }
	 /**
	 * 	作用：产生随机字符串，不长于32位
	 */
	 public function createNoncestr( $length = 32 )
	 {
	 $chars = "abcdefghijklmnopqrstuvwxyz0123456789";
		$str ="";
		for ( $i = 0; $i < $length; $i++ )  {
			$str.= substr($chars, mt_rand(0, strlen($chars)-1), 1);
			}
			return $str;
			}
			/**
		 * 	作用：array转xml
		 */
		 function arrayToXml($arr)
		 {
			$xml = "<xml>";
			foreach ($arr as $key=>$val)
			{
			if (is_numeric($val))
				{
				$xml.="<".$key.">".$val."</".$key.">";
	
				}
				else
				$xml.="<".$key."><![CDATA[".$val."]]></".$key.">";
		}
			$xml.="</xml>";
					return $xml;
			}
	
							/**
							* 	作用：格式化参数，签名过程需要使用
							*/
							public function formatBizQueryParaMap($paraMap, $urlencode)
							{
							$buff = "";
							ksort($paraMap);
							foreach ($paraMap as $k => $v)
								{
								if($urlencode)
								{
								$v = urlencode($v);
							}
							//$buff .= strtolower($k) . "=" . $v . "&";
							$buff .= $k . "=" . $v . "&";
							}
							$reqPar;
							if (strlen($buff) > 0)
							{
				$reqPar = substr($buff, 0, strlen($buff)-1);
			}
			return $reqPar;
		}
	
	
	
	
	
}